ASP.NET Web API 有兩種輸出格式 XML 和 JSON,會根據發送的 Accept 標頭決定回應的格式,而在沒有指定或查無格式的情況下,會預設回應 JSON 格式的內容。
測試程式:
namespace Api
{
[RoutePrefix("api/test")]
public class TestController : ApiController
{
//測試API
[HttpGet]
[Route("live")]
public List<Student> Live()
{
return new List<Student>
{
new Student
{
Id = 100,
Name = "小明"
},
new Student
{
Id = 101,
Name = "小華"
},
};
}
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
}
下列為 Postman 測試結果。
Accept: application/xml
Accept: application/json
接著試著在 Chrome 瀏覽器上直接輸入 API 網址。
可以看到因為 Chrome 瀏覽器預設會發送 XML 的 Accept,所以 Web API 回傳 XML 的資料,不過這樣在開發時不是很方便,可以直接在瀏覽器上看到 JSON 格式的資料嗎?
在 第一篇 的 Startup 內加入下方程式碼,將 XML 的 Formatter 移除,這樣 Web API 就會統一回應 JSON 格式的資料。
//移除 XML Formatter
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
結果:
如果希望回傳的 JSON 縮排換行,方便閱讀,可以加入以下程式碼。
//JSON 縮排
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
結果:
完整程式碼:
[assembly: OwinStartup(typeof(Core.Startup))]
namespace Core
{
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var config = new HttpConfiguration();
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//移除 XML Formatter
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
//JSON 縮排
config.Formatters.JsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented;
app.UseWebApi(config);
}
}
}
結語:
今天介紹了如何控制 Web API 輸出 XML 和 JSON 格式的資料,而移除 XML 和格式化是為了方便測試,正式上線後記得移除,確保 API 完整支持 XML 和 JSON,且輸出的資料最小化,這篇就到這裡,感謝大家觀看。
參考文章:
如何讓 ASP.NET Web API 無論任何要求都回應 JSON 格式
ASP.NET Web API 入門常用技巧